Skip to content

docs(pm-dispatch): three measured platform readings into the readings ledger - #15955

Draft
claude[bot] wants to merge 3 commits into
mainfrom
claude/issue-15647-readings-increment-four
Draft

docs(pm-dispatch): three measured platform readings into the readings ledger#15955
claude[bot] wants to merge 3 commits into
mainfrom
claude/issue-15647-readings-increment-four

Conversation

@claude

@claude claude Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Part of #15647
Fixes #15917
Fixes #15960

Three measured platform readings were absent from the pm-dispatch readings ledger. They land here as one rule line each, placed in the section each belongs to. Two files move: .claude/skills/pm-dispatch/references/platform-readings.md (the three lines) and scripts/pm/check-skill-line-ratchet.mjs (the ceiling the ruling below raised for them). Nothing else.

The ruling this PR executes

The ledger's line ratchet is shrink-only, and its own gate row requires a raise to be a maintainer's with the ruling quoted here: 「scripts/pm/check-skill-line-ratchet.mjs | 本文件行数只降不升(pnpm check:pm-skill-ratchet);抬上限需维护者裁决引用在 PR 正文」. That ruling was given on decision card #15960, comment 5559776878, 2026-09-06 14:10Z (decision batch #56). The maintainer's reply to the batch, verbatim and untranslated:

其他同意

recorded as option A. The director record's own sentences for it, quoted verbatim:

The ceiling in scripts/pm/check-skill-line-ratchet.mjs for .claude/skills/pm-dispatch/references/platform-readings.md moves 359 → 362; ruledRaises records +3 with this comment as the citation; PR #15955's body quotes this ruling verbatim (the SKILL.md gate row: 「抬上限需维护者裁决引用在 PR 正文」).

All three lines land as authored (zero-quota timeline truncation; the authoritative turbo Failed: reading over multi-package ELIFECYCLE; first-differing-offset comparison after trailing-blank normalisation). No existing line is deleted to pay for them (option C rejected); no line is dropped (option B not needed).

Executed exactly as written: the ceiling row moves 359 → 362, one ruledRaises record is added with delta: 3, dated, quoting the ruling. was does not move, no other entry in the map moves, and the ledger file itself is not re-edited — the three lines it already carries are the deliverable.

The ratchet reading, before and after

Before, at b4a0e42 — red by exactly 3, by design:

✗ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/platform-readings.md is 362 lines; the ratchet ceiling is 359.

After, at this head:

✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/platform-readings.md is 362 lines (ceiling 362; headroom 0).

Headroom returns to 0, the convention every entry in the map uses.

The move arithmetic still balances, and that is the part a ruled raise could quietly have broken. This entry is also the DESTINATION of the declared cross-file move, whose was is the file's literal pre-move 314. An ordinary ruled raise is the maintainer's, not the move's, so it is subtracted before the move's own raise is priced — which is what the new ruledRaises record is for, and why was was not carried forward instead:

✓ check-skill-line-ratchet: cross-file move into .claude/skills/pm-dispatch/references/platform-readings.md: +11 (314→362, less 37 lines of ordinary ruled raise) against a net source decrease of 20 (.claude/skills/pm-dispatch/references/lanes/cli.md 35→29, .claude/skills/pm-dispatch/references/lanes/services.md 30→27, .claude/skills/pm-dispatch/references/rest-channel.md 93→82); authorised by #14685 item 5 (comment 5520452691).
✓ check-skill-line-ratchet: declared cross-file moves: 1, total ceilings down 9 lines.

The move's own raise reads +11 before and after, unchanged: the +3 lands in the ruled-raise column, not the move's. The map-wide total is still DOWN, not up.

Dedup first — every candidate grepped against the rewritten file

Section 1 of #15647 offered four facts, Addendum 2 a fifth, and #15917 a sixth. Each was grepped against the file as PR #15641 left it before anything was written:

  • list_issues with two labels returns their UNION, not their intersection. grep 并集 / 求交PRESENT at line 217, elaborated through 222. Skipped.
  • A body PATCH's attribution-footer behaviour is surface- and edit-specific, read back and counted, never predicted. grep 页脚PRESENT: line 283 carries the double-localisation and the prohibition on reading it as a law, 286 the counter-example on the same wrapper, 290 the create-versus-edit variance plus the mandatory read-back. Skipped.
  • The platform normalises blank lines around a trailing rule in both directions. grep 空行 / 归一 / 横线 / 长度 / 偏移ABSENT. Landed.
  • A turbo job prints ELIFECYCLE Command failed for many packages when one task failed. grep ELIFECYCLE / turbo / FailedABSENT; line 252 is about adjacency not implying causality, a different fact. Landed.
  • The REST timeline event for queue entry is added_to_merge_queue, not enqueued. grep added_to_merge_queue / enqueuedPRESENT at line 10, with line 12 already naming pull_request.enqueued as the webhook-side name. Skipped.
  • The zero-quota payload's timeline arrays are capped and drop the newest items. grep totalCount / get_comments / hasNextPagePARTIAL: line 143 records the cap and line 146 the generic absence rule, but the durable discriminant, the newest-first direction and the named authoritative fallback are all absent. Landed.

What landed, and one correction to the card's own wording

Three lines, each under the 120-byte cap:

  • payload-channel entry, after line 146 — compare each timeline array against totalCount; short means the newest items are missing, so a claim check goes to the paged get_comments read.
  • 读数陷阱, after line 252 — the authoritative reading of a multi-package ELIFECYCLE spray is the Failed: line plus that package's own error annotation.
  • 读数陷阱 write-side cluster, after line 290 — compare a read-back body at the first differing offset, never by length.

Correction, measured on this card while writing the line. #15917 and the dispatch both spell the payload comparison as count against totalCount. There is no count field. The payload block carries pageInfo, totalCount and edges, and the figure being compared is the length of edges. The rule line is spelled that way, so a reader is not sent looking for a field that does not exist.

Second measurement from the same read, on #15647 itself: frontTimelineItems came back with 15 edges against totalCount 27 and hasNextPage: true, while backTimelineItems came back with 0 edges against the same totalCount 27 and a pageInfo carrying hasPreviousPage, not hasNextPage. So the existing line-146 discriminant is structurally blind on the tail array — the new line's "compare both arrays" is what covers it. The measurement stays here; the ledger keeps only the rule.

Why the ceiling could not be paid in place

Line-neutral folding was measured, not assumed: of the ledger's 333 adjacent rule pairs, zero fit the 120-byte line cap when merged, so there is no re-wrap slack at all — and re-wrap is in any case not legal currency for buying lines (the 2026-08-17 rule). Nothing was deleted to pay, per the ruling. The +3 is accounted for line by line beside the ceiling entry itself: payload-channel discriminant +1, the authoritative Failed: reading +1, the first-differing-offset comparison +1.

Serial constraint against flight B — proven, not assumed

Flight B's PR #16357 (f5c08e9589) edits the same map, at the row-bytes pin table. This PR touches the ceiling table and the ruledRaises list only. Merge-tree proof at this head, run twice — once as this clone is configured, and once with the repo's custom merge driver disabled, because this repo registers merge=os-regen per clone and a driver's exit 0 means "the driver took it", not "no conflict", while the server has no driver registered:

git merge-tree --write-tree HEAD f5c08e9589                                  → exit 0, 0 CONFLICT lines
git -c merge.os-regen.driver=false merge-tree --write-tree HEAD f5c08e9589   → exit 0, 0 CONFLICT lines

Both produce the identical tree 867c5e239f, so the two readings agree rather than merely both being green.

origin/main (f377394ae2) was merged into this branch as a merge commit — no rebase, no amend, no force-push. After the merge the branch's own diff against origin/main is exactly the three ledger lines plus this ceiling change, and nothing else.

Verification

At commit 04b61b5f6a, the final head; every figure below read from that tree, and every exit captured BEFORE any pipe.

  • node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 38 families from the real change set (the script derives it itself from the merge base — 2 committed paths, 0 working-tree, 0 untracked). All 38 were run; --ran reconciles: ✓ dispatch-gates --ran: 38 derived famil(ies) accounted for — 38 run, 0 NOT-MEASURED.
  • 37 of the 38 were green on the first pass. The 38th, pnpm --filter @objectstack/lint run check:doc-formula-expressions, exited 3 — PREREQUISITE NOT MET, which measures nothing; after turbo run build --filter=@objectstack/formula --filter=@objectstack/lint it exits 0. Recorded as a re-run, not as a failure.
  • node scripts/pm/check-skill-line-ratchet.mjs --self-test155 cases pass; the live run is the green quoted above, with zero red lines. One advisory prints, and it is not this diff's: it names .claude/skills/spec-property-retirement/SKILL.md's row-bytes pin, whose file and whose pin row are both byte-identical to origin/main in this branch — it is the pin flight B is paying down.
  • node scripts/pm/check-skill-id-lint.mjs (self-test + live) — green. The scanned corpus is the pm-dispatch markdown tree, .claude/agents/os-dev.md and AGENTS.md; the ruling citations added here live in the .mjs, which is deliberately outside it.
  • node scripts/pm/check-half-states.mjs --self-test2,553 cases pass.
  • node scripts/pm/check-governed-merges.mjs --test on the real two-path file list exits 3 — GOVERNED, on .claude/**. This PR stays a draft; no seat flips it ready, enqueues it, or arms auto-merge.
  • pnpm check:nul-bytes — green (75 self-test assertions; 8,030 text files scanned, no raw ASCII control bytes), plus a direct scan of both changed files for the wider control-character class: 0 hits.
  • Whole-repo pnpm lint (eslint . --no-inline-config, full population, no narrowing) through scripts/pm/os-verify-lock.sh slot issue-15647: VERDICT command-exit 0 · held the lock 104s. Shared-box seconds, as the wrapper itself states.

维护者速读(草稿)

这是什么。 pm-dispatch 的「平台读数事实表」是 PM 与 dev 席位在操作 GitHub 时的查表依据 —— 哪个字段可信、哪个读数是静默假阴性、配额往哪走。本 PR 往里加三条实测规则,一条一行;并按您 09-06 的裁决把该文件的行数上限从 359 抬到 362,好让这三行完整落地。

为什么值得改。 三条里最重的一条是认领读数:零配额通道读单卡时间线会静默丢掉最新的几条评论,而认领评论按定义就是最新那条。席位据它判「这张卡没人认领」,就会重复认领、两个 agent 撞在同一张卡上 —— 已经发生过一次未遂。新规则给出一个不依赖缓存行为的判别式,并点名权威回退读法。另两条分别防「把陪葬包读成故障源」和「两段不同的正文因长度相等被判相同」。

这轮做了什么。 上一轮把三行顶着棘轮落地、PR 在棘轮上红 3,是为了把实测数字摆到您面前,不自行抬上限。您裁了 A,这轮就只做裁决说的两件事:上限行 359 改 362,并在跨文件搬运声明里补一条 +3 的「已裁提额」记录,把它与搬运自己的额度分开记账。事实表本身一个字没再动,也没有为了变绿删掉任何既有内容。

代价是什么。 事实表多 3 行,棘轮回到 0 余量。该文件确实一条折行余量都没有:333 对相邻规则行里,合并后能塞进 120 字节上限的是 0 对 —— 这是实测,不是估计。全表总额仍是净下降 9 行,没有因这次提额而增长。

风险面。 纯文档 + 一处门禁常量,零运行时影响,零发布面;.claude/** 属受管面,按规矩人工合并。回滚 = revert 两个 commit。与并行的 PR #16357 改同一个文件的不同段落,已用 merge-tree 双向证过无冲突。

席位意见:

Generated by Claude Code


Generated by Claude Code

…gs ledger

Three rules absent from `references/platform-readings.md`, one line each, placed
in the section each belongs to:

- payload-channel entry: compare each timeline array's `edges` length against
  `totalCount`; short means the NEWEST items are missing, so a claim check goes
  to the paged `get_comments` read. The existing `hasNextPage` discriminant is
  blind on `backTimelineItems`, whose `pageInfo` carries `hasPreviousPage`
  instead.
- 读数陷阱: a turbo job prints `ELIFECYCLE Command failed` for many packages
  when one task failed; the authoritative reading is the `Failed:` line plus
  that package's own `##[error]`.
- 读数陷阱 write-side cluster: the platform normalises blank lines around a
  trailing `---` rule in both directions, so a read-back comparison goes by the
  first differing offset, never by length.

Deduplicated against the rewritten file first: the `list_issues` two-label union
fact, the `added_to_merge_queue` timeline event name, and the surface- and
edit-specific footer write-side behaviour are all already present and were not
re-added.

The file has zero headroom (359/359) and zero fold slack: none of its 333
adjacent rule pairs fits the 120-byte line cap when merged. The three lines are
therefore landed measurement-first at 362 lines; the ratchet reads RED by 3 by
design and the ceiling row is deliberately NOT raised here.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox

os-steve commented Sep 5, 2026

Copy link
Copy Markdown
Collaborator

ACCEPT, pending the ceiling ruling — lands #15647 section 1 and #15917 as ruled, measurement-first. The diff is correct and complete; what stands between it and the governed terminal is one number the maintainer owns: the readings ledger's ceiling, 359 → 362, put to him as decision card #15960 with this PR's measured count. Governed (.claude/skills/**, predicate exit 3): draft stays; reviewers are requested after the patch round that quotes the ruling, not on a red head.

What the seat verified, at head b4a0e4258d, in its own compare worktree

  • One file, +3/−0. The three lines sit where they belong: the payload-channel entry (after the generic absence rule), the 读数陷阱 CI cluster, and the write-side footer cluster. Widest written line 117 bytes; check-skill-id-lint 24 files clean; check-governed-merges --test exit 3.
  • Dedup holds: the union fact (line 217), the footer write-side variance (283/286/290) and added_to_merge_queue (line 10) are present on main, so skipping them was right; ELIFECYCLE, the first-differing-offset rule and the edges-vs-totalCount discriminant were absent.
  • The correction to the cards is accepted: the payload block has no count field; the compared figure is the length of edges, and the landed line is spelled that way. The second measurement (the tail array carries hasPreviousPage, so the existing hasNextPage discriminant is blind on it) is the reason the line says both arrays.
  • Ratchet, seat's own run on the head: 362 lines; the ratchet ceiling is 359, exit 1 — red by exactly 3, the ceiling row untouched, no fact dropped. The 333-pair zero-fold measurement is the dev's; the seat did not repeat it and says so on [Decision] platform-readings.md ceiling 359 → 362 for the fourth readings increment (PR #15955, red on the ratchet by design) #15960.
  • CI, seat's read 16:3xZ: 29 check runs — 16 success, 12 skipped, 1 failure (Lint & Repo Gates, at the ratchet step; the steps behind it are unmeasured on this head until the ceiling lands — a known cost of this route).

Open questions answered: Q1 → decision card #15960 (recommendation A, fallback B, with the dev's note that the ELIFECYCLE line is the weakest). Q2 → B: the census-population sentence is section 2's material and is already in the decision box; no fifth line. Q3 → A: measurement-first is the ruled route for a zero-headroom governed ledger; the os-dev.md clause is narrowed by #15959 (filed, behind #14768 on the same file). #15957 graded into the re-lock pass.

Next on this PR: when #15960 is ruled, a patch round on this branch sets the ceiling row, quotes the ruling in the body, adds the ruledRaises record; then reviewers, needs-user-decision and the final 速读 follow at the governed terminal.

Implemented-by: os-dev executor, flight #15647 section 1 + #15917, branch claude/issue-15647-readings-increment-four
Reviewed-by: pm-dispatch skills seat, https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox


Generated by Claude Code

…uled raise

The ordinary maintainer exit, taken: the ceiling for
`.claude/skills/pm-dispatch/references/platform-readings.md` moves 359 -> 362 so
the three measured readings this branch already carries land whole. No existing
line is deleted to pay for them and no line is dropped.

The raise is recorded twice, as this map's own shape prescribes:

- the ceiling entry's comment stack gains the ruling, quoted verbatim and
  untranslated with the comment id, plus the per-reading accounting that spends
  the +3 exactly (payload-channel discriminant +1, the authoritative `Failed:`
  reading of a multi-package ELIFECYCLE spray +1, the first-differing-offset
  comparison +1) and the measurement that shows it could not be paid in place:
  zero of the file's 333 adjacent rule pairs fit the 120-byte cap when merged.
- `CROSS_FILE_MOVES`' declaration for the same file gains one `ruledRaises`
  record, `delta: 3`, dated, quoting the same ruling. An ordinary ruled raise is
  the maintainer's, not the move's, so it is subtracted before the move's own
  raise is priced: 362 - 314 - (34 + 3) leaves the same +11 against the sources'
  net decrease of 11, and the map-wide total is unchanged.

`was` does not move. Nothing else in the map moves.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
@github-actions github-actions Bot added size/s and removed size/xs labels Sep 6, 2026
@claude

claude Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor Author

ACCEPT — contract-tier review of PR #15955, head 04b61b5f6a (skills seat, 2026-09-06T16:1xZ), after the patch round that executes #15960's ruling A.

Implemented-by: claude/issue-15647-readings-increment-four (os-dev subagent — the fourth increment's flight of 2026-09-05, opus; the patch round of 2026-09-06, opus)
Reviewed-by: session_019RfFHiRCSs3JXLK4cwcfox (skills seat)

Verified in a detached compare worktree at the PR head, not from the report:

Two observations the dev noted, accepted as notes: the ruledRaises docblock still illustrates its subtraction with the numbers of an earlier state (397 − 314 − (34 + 39)), now historical — it rides the next touch of the ratchet map (#16343 refreshes a comment in the same file); and the one live advisory is flight B's, resolved when PR #16357 merges.

Next on this file: the fifth readings increment (#15977 · #16006 · #16104 section 1 · #15803 section C) needs its own lines above a ceiling that is again at headroom 0 — the seat presents that raise to the maintainer as a decision card at dispatch, the same shape as #15960, and asks in the same card whether a standing rule (each seat-verified readings increment raises the ceiling by its measured line count, recorded in ruledRaises, without a per-increment card) is preferred.

Landing regime: governed (.claude/**) ⇒ the PR stays a draft; reviewers os-zhuang + hotlong requested in this same act, needs-user-decision added, the final 维护者速读 posted as the next comment; human merge. On the merge #15917 and #15960 close by Fixes; #15647 stays open for its sections 2–3.


Generated by Claude Code

@claude
claude Bot requested review from hotlong and os-zhuang September 6, 2026 16:19
@claude

claude Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor Author

维护者速读

事情:pm-dispatch 的「平台读数事实表」是各席位操作 GitHub 时的查表依据——哪个字段可信、哪个读数是静默假阴性。本 PR 加三条实测规则(一条一行),并按您今天裁的 A 把该文件的行数上限从 359 抬到 362。

三条里最重的一条:零配额通道读单卡时间线会静默丢掉最新几条评论,而认领评论按定义就是最新那条;席位据它判「没人认领」就会撞卡——已发生过一次未遂。新规则给出不依赖缓存的判别式(比较 edges 长度与 totalCount)并点名权威回退读法。另两条防「把陪葬包读成故障源」和「两段不同正文因长度相等被判相同」。

这轮做了什么:上一轮三行顶着棘轮落地、PR 在棘轮上红 3,是为了把实测数字摆到您面前而不自行抬上限;您裁了 A,这轮只做裁决说的两件事——上限 359 → 362,并在跨文件搬运声明里补一条 +3 的「已裁提额」记录,把它与搬运自己的额度分开记账。事实表一个字没再动,也没有为了变绿删任何既有内容。全表总额仍净降 9 行。

要请您留意的:这个文件的余量又回到 0,而第五次读数增量(四张卡的十来条事实)已在排队。届时席位会再立一张同形的决策卡请您抬上限,并同时问一句:是否愿意定一条常设规则——每次席位核过的读数增量按实测行数抬上限、记进 ruledRaises,不再逐次立卡。

席位意见:建议合并。受管面(.claude/**),人工合并;合并后 #15917#15960 关闭,#15647 留给第 2、3 节。与同文件的 PR #16357 已做 merge-tree 验证,零冲突。


Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation needs-user-decision size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants